package com.nf.mvc.argument;

import com.nf.mvc.MethodArgumentResolver;
import com.nf.mvc.support.WebTypeConverter;
import com.nf.mvc.support.converter.DoubleTypeConverter;
import com.nf.mvc.support.converter.IntegerTypeConverter;
import com.nf.mvc.util.ClassUtils;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Parameter;

import static com.nf.mvc.support.WebTypeConverters.convert;


public class SimpleTypeMethodArgumentResolver implements MethodArgumentResolver {
    @Override
    public boolean supports(Parameter parameter) {
        Class<?> type = parameter.getType();
        //8大基本类型以及对应的包装类型和其它几个类型，比如LocalDate就认为是简单类型，
        // 此解析器可以解析
        return ClassUtils.isSimpleType(type);
    }

    @Override
    public Object resolveArgument(Parameter parameter, HttpServletRequest request) throws Exception {
        // 反射api获取方法参数名默认是获取不到的，arg0，arg1
        String name = parameter.getName();
        Class<?> type = parameter.getType();
        //前端有可能没有这个参数对应的数据，value可能是个null
        Object value = request.getParameter(name);
        if (value == null && type.isPrimitive()) {
            throw new IllegalArgumentException("null值不能赋值给简单类型");
        }
        if (value != null) {
            value = convert(value.toString(), type);
        }
        //到这里时，value仍然可能是null的，但null赋值给非简单类型是没有问题
        return value;
    }


}
